package com.augurit.common.system.service.org;


import java.util.List;
import java.util.Map;

import org.springside.modules.orm.Page;

import com.augurit.common.base.service.IBaseService;
import com.augurit.common.syscode.web.form.SysCodeForm;
import com.augurit.common.system.web.org.form.AcFunctionForm;
import com.augurit.common.system.web.org.form.AcModuleForm;

/**
 * 模块接口
 */
public interface IAcModuleService extends IBaseService<AcModuleForm, Long> {	

	/**
	 * 根据应用主键ID查找该应用下的所有模块和子模块的ID集合
	 * @param appId 应用id
	 * @return 模块id数组
	 */
	public Long[] getAllModuleIds(Long appId);
	
	/**
	 * 获取指定应用的所有模块及子模块
	 * @param appId 应用ID
	 * @return 所有模块及子模块form对象列表
	 */
	public List<AcModuleForm> getAllModules(Long appId);
	
	/**
	 * 分页获取指定应用的所有模块及子模块
	 * @param appId 应用ID
	 * @param page 分页对象
	 * @return 所有模块及子模块form对象列表
	 */
	public Page<AcModuleForm> getAllModules(Long appId, Page<AcModuleForm> page);
	
	/**
	 * 获取指定应用的直属模块的ID集合
	 * @param appId 应用ID
	 * @return 直属模块form对象列表
	 */
	public Long[] getModuleIds(Long appId);
	
	/**
	 * 获取指定应用的直属模块列表
	 * @param appId 应用ID
	 * @return 直属模块form对象列表
	 */
	public List<AcModuleForm> getModules(Long appId);

	/**
	 * 分页获取指定应用的直属模块列表
	 * @param appId 应用主键ID
	 * @return 模块form对象列表
	 */
	public Page<AcModuleForm> getModules(Long appId, Page<AcModuleForm> page, Map<String, List<SysCodeForm>> sysCodeBuffer);
	
	/**
	 * 获取指定父模块的所有子模块的ID集合
	 * @param parentModuleId 指定父模块ID
	 * @return 模块id数组
	 */
	public Long[] getAllChildModuleIds(Long parentModuleId);
	
	/**
	 * 获取指定父模块的所有子模块Form对象列表
	 * @param parentModuleId 指定父模块ID
	 * @return 模块form对象
	 */
	public List<AcModuleForm> getAllChildModules(Long parentModuleId);
	
	/**
	 * 分页获取指定父模块的所有子模块Form对象列表
	 * @param parentModuleId 指定父模块ID
	 * @param page 分页对象
	 * @return 模块form对象
	 */
	public Page<AcModuleForm> getAllChildModules(Long parentModuleId, Page<AcModuleForm> page);
	
	/**
	 * 获取指定父模块的直属模块的ID集合
	 * @param parentModuleId 指定父模块ID
	 * @return 模块id数组
	 */
	public Long[] getChildModuleIds(Long parentModuleId);
	
	/**
	 * 获取指定父模块的直属模块列表
	 * @param parentModuleId 指定父模块ID
	 * @return 模块form列表
	 */
	public List<AcModuleForm> getChildModules(Long parentModuleId, Map<String, List<SysCodeForm>> sysCodeBuffer);

	/**
	 * 分页获取指定父模块的直属模块Form对象列表
	 * @param parentModuleId 指定父模块ID
	 * @param page 分页对象
	 * @return 包含模块form对象的分页对象
	 */
	public Page<AcModuleForm> getChildModules(Long parentModuleId, Page<AcModuleForm> page, Map<String, List<SysCodeForm>> sysCodeBuffer);
	
	/**
	 * 获取父模块id
	 * @param moduleId 模块id
	 * @return 父模块id
	 */
	public Long getParentModuleId(Long moduleId);
	
	/**
	 * 获取父模块form对象
	 * @param moduleId 模块id
	 * @return 模块form对象
	 */
	public AcModuleForm getParentModule(Long moduleId);
	/**
	 * 获取指定模块的直属功能列表
	 * @param moduleId 模块ID
	 * @return 指定模块的直属功能form对象列表
	 */
	public List<AcFunctionForm> getFuncs(Long moduleId);
	

	 
	
	/**
	 * 找出模块下所有的功能点，包括其子模块下的功能点
	 * @param moduleId：模块主键
	 * @return 返回模块下所有的功能form列表
	 */
	public List<AcFunctionForm> getAllFuncs(Long moduleId);
	
	/**
	 * 获取模块列表下的直属功能列表
	 * @param moduleIds 模块列表id
	 * @return 模块列表下的所有模块的直属功能集合的列表
	 */
	public List<AcFunctionForm> getFuncs(Long[] moduleIds);
	
	/**
	 * 获取模块下的直属模块及功能列表
	 * @param mouduleId 模块id
	 * @return 模块form对象
	 */
	public AcModuleForm getModuleRelatedElements(Long moduleId, Map<String, List<SysCodeForm>> sysCodeBuffer);
	
	/**
	 * 级联添加模块
	 * @param form 模块对象,接受来自页面的参数
	 */
	public void addModuleCascade(AcModuleForm form);
	
	/**
	 * 根据模块主键ID级联删除模块
	 * @param moduleId 模块的主键ID
	 * @param isDelSubModules，是否删除模块下的子模块,true:删除。反之则相反
	 */
	public void deleteModuleCascade(Long... moduleId);
	
	/**
	 * 获取指定模块所属的应用的id
	 * @param moduleId:模块id
	 * @return:指定模块所属应用的id
	 */
	public Long getAppId(Long moduleId);

}
